package com.dubbo.common.redis.impl;

import com.alibaba.fastjson.JSON;
import com.dubbo.common.SerializeUtil;
import com.dubbo.common.redis.RedisService;
import redis.clients.jedis.JedisCluster;

import javax.annotation.Resource;
import java.util.Set;


/**
 * 集群版实现类
 */
@SuppressWarnings("all")
public class JedisClusterServiceImpl implements RedisService {
	/** 注入JedisCluster连接池对象 */
	@Resource
	private JedisCluster jedisCluster;
	
	/**
	 * 设置键对应的值
	 * @param key 键
	 * @param value 值
	 * @return 状态码
	 */
	public String set(String key, String value){
		return jedisCluster.set(key, value);
	}
	/**
	 * 设置键对应的值 (生存时间)
	 * @param key 键
	 * @param value 值
	 * @param seconds 秒数
	 * @return 状态码
	 */
	public String setex(String key, String value, int seconds){
		return jedisCluster.setex(key, seconds, value);
	}
	/**
	 * 通过键获取指定的值
	 * @param key 键
	 * @return 值
	 */
	public String get(String key){
		return jedisCluster.get(key);
	}
	/**
	 * 根据键删除指定的值
	 * @param key 键
	 * @return 状态码
	 */
	public Long del(String key){
		return jedisCluster.del(key);
	}
	/**
	 * 设置键的生存时间
	 * @param key 键
	 * @param seconds 秒
	 * @return 状态码
	 */
	public Long expire(String key, int seconds){
		return jedisCluster.expire(key, seconds);
	}
	/**
	 * 获取一个键自增长的值
	 * @param key 键
	 * @return 自增长的值
	 */
	public Long incr(String key){
		return jedisCluster.incr(key);
	}
	/**
	 * 删除当前选定数据库的所有键
	 */
	@Override
	public String delAll() {
		// TODO Auto-generated method stub
		return jedisCluster.flushDB();
	}
	/**
	 * 返回当前选定数据库中的键数量
	 */
	
	@Override
	public Long dbSize() {
		// TODO Auto-generated method stub
		return jedisCluster.dbSize();
	}
	/**
	 * 根据键名模糊查询所有key
	 */
	@Override
	public Set<String> keys(String pattern) {
		// TODO Auto-generated method stub
		return jedisCluster.hkeys(pattern);
	}
	/**
	 * 根据key获取字节数组
	 */
	@Override
	public byte[] getByte(String key) {
		// TODO Auto-generated method stub
		
		return jedisCluster.get(key.getBytes());
	}
	/**
	 * 设置键对应的序列化值
	 */
	@Override
	public String set(String key, byte[] value) throws Exception {
		// TODO Auto-generated method stub
		byte[] serialize = SerializeUtil.serialize(key);
		return jedisCluster.set(serialize, value);
	}
	/**
	 * 设置键对应的序列化值
	 */
	@Override
	public String setex(String key, byte[] value, int timeout) throws Exception {
		// TODO Auto-generated method stub
		byte[] serialize = SerializeUtil.serialize(key);
		return jedisCluster.setex(serialize, timeout, value);
	}
	/**
	 * 通过键获取指定的值
	 */
	@Override
	public <T> T get(String key, Class clazz) {
		try {
			byte[] serializeKey = SerializeUtil.serialize(key);
			byte[] value = jedisCluster.get(serializeKey);
			String valueStr = (String) SerializeUtil.deserialize(value);
			return (T) JSON.parseObject(valueStr,clazz);
		} catch (Exception e) {
			return null;
		}
	}
}